// =====================================================================================
// 
//       Filename:  GameManager.hh
// 
//    Description:  Interfaccia della classe GameManager la quale gestisce
//                  tutta la fase di gioco
// 
//         Author:  Davide Poletti (), davide.pole@gmail.com
//					punt_attaccanteolo Pigato , p.pigato@hotmail.com	
//        Compunt_attaccanteny:  P&P.cpp
// 
// =====================================================================================
#include "GameManager.hh"

GameManager::GameManager(int dim_mare, bool tipo_G1, bool tipo_G2, int level_G1, int level_G2)
{
    _tocca1 = true;
    if (tipo_G1){
        _giocatore1 = new GiocatoreUmano(dim_mare);         
    } else {
        _giocatore1 = new GiocatoreComputer(dim_mare, level_G1);
    }
    if (tipo_G2){
        _giocatore2 = new GiocatoreUmano(dim_mare);         
    } else {
        _giocatore2 = new GiocatoreComputer(dim_mare, level_G2);
    }
}

GameManager::~GameManager()
{
    delete _giocatore1;
    delete _giocatore2;
}

void GameManager::inizializza_partita()
{
    list<int> lista_dim_navi;
    bool inserimento = true;
    int dim_nave;	                                           
    cout << "Inserimento delle navi" << endl;
    do { 
        cout << "Giocatore 1, decidi se e come posizionare una nave" << endl;
        dim_nave = _giocatore1->posiziona_nave();
        cout << "Dimensione scelta: " << dim_nave << endl;
        if(dim_nave >= 1 && dim_nave <= 5) {        
            lista_dim_navi.push_back(dim_nave);
        } else {
            inserimento = false;
            cout << "GM: errore, dimensione della nave illegale" << endl;
        }	
    } while (inserimento);
    lista_dim_navi.sort();
    list<int>::reverse_iterator dim;
    for(dim = lista_dim_navi.rbegin(); dim != lista_dim_navi.rend(); ++dim){
        cout << "Giocatore 2 posiziona una nave\n" << endl;
        _giocatore2->posiziona_nave(*dim);	
    }   	
}

int GameManager::turno()
{
    int esito;
    Giocatore* _attaccante;
    Giocatore* _difensore;
    cout << endl << "************************************" << endl;
    if (_tocca1) {
        cout << "Giocatore 1" << endl;
        _attaccante = _giocatore1;    
        _difensore = _giocatore2;
    } else {
        cout << "Giocatore 2" << endl;
        _attaccante = _giocatore2;
        _difensore = _giocatore1;
    }
    pair<int,int> colpo = _attaccante->spara();
    esito = _difensore->subisci_sparo(colpo);	
    _attaccante->aggiorna_con_esito(colpo,esito);
    return esito;
}


void GameManager::partita()
{
    inizializza_partita();
    int esito = 0;
    while ( esito != 4 ) {
        esito = turno();
        switch (esito){
            case 1 : cout << "Acqua" << endl;
                     break;
            case 2 : cout << "Colpito" << endl;
                     break;
            case 3 : cout << "Colpito e affondato" << endl;
                     break;
            case 4 : if (_tocca1 ) {
                         cout << "BRAVO GIOCATORE 1 HAI VINTO!" << endl;
                     }else{
                         cout << "BRAVO GIOCATORE 2 HAI VINTO!" << endl;
                     }
                     break;
            default : cout << esito << " GM: Errore, esito non contemplato" << endl;
        }
        if (_tocca1) {
            _tocca1 = false;
        }else{
            _tocca1 = true;	
        }		
    }

}

